//2555.两个线段获得的最多奖品
class Solution {
public:
    int maximizeWin(vector<int>& nums, int k) {
        int n=nums.size();

        //控制两个区间,保持区间内的最大差控制在k以内
        int i=0;

        for(i=1;i<n;i++) 
        if(nums[i]-nums[0]>k) break;   //先找到前面的第一个区间

        //此时[0,i)是一个区间
        int l1=0,r1=i-1,l2=i;       //[l1,r1][l2,i]分别表示两个区间
        int tmp=r1-l1+1,ret=0;
        for(i=l2+1;i<n;i++)         //枚举右边的区间,维护左边区间的最大值
        {
            while(nums[i]-nums[l2]>k)
            {
                l2++,r1++;
                while(nums[r1]-nums[l1]>k) l1++;
                tmp=max(tmp,r1-l1+1);
            }
            ret=max(ret,tmp+i-l2+1);
        }
        if(l2==n-1) ret=max(ret,tmp+1);  //处理当一个区间就能包含n-1个个数,即不会进入for循环的情况
        else if(l2==n) ret=max(ret,tmp);       //处理一个区间就能包含所有数的情况
        return ret;
    }
};